//<T>就是一个类型参数
//T就是一个类型,相当于是"形参"
class MyArrayTemplate<T>{
    //此时arr是T[]类型,并不确定T的类型,得在后面实例化的时候才能确定
    //由于T类型本身未知,不能直接new T[10],(在C++中是可以的)
    private T[] arr = (T[]) new Object[10];

    private T get(int index){
        return arr[index];
    }

    public void set(int index,T value){
        arr[index] = value;
    }
}

public class Test4 {
    public static void main(String[] args) {
        //针对上述MyArrayTemplate进行实例化
        //泛型参数类型T就指定为 Integer
        //针对arr1来说就只能存储类型为Integer的数据
        MyArrayTemplate<Integer> arr1 = new MyArrayTemplate<>();

        //泛型参数类型T就指定为String
        //针对arr2来说,就只能存储String类型的数据
        MyArrayTemplate<String> arr2 = new MyArrayTemplate<>();

        //针对泛型参数来说,只能指定引用类型,不能指定内置类型
        //泛型这一套语法体系,底层还是靠Object这一系列继承关系来完成的
//        MyArrayTemplate<int> arr3 = new MyArrayTemplate<>();

        //只是警告,而不是编译报错
        //泛型参数类型T指定为Object
        //这种写法并不推荐,没有什么意义,只是为了兼容旧版本的Java代码
        MyArrayTemplate arr3 = new MyArrayTemplate();
    }

}
